package concurrency.basicthreading.demo;
import java.util.concurrent.TimeUnit;

/**
 * 使用线程驱动任务的方式：
 * 1. 直接继承Thread 重写run()方法。
 * 
 * 2. 直接实现自管理的Runnable接口并实现run()方法。
 * 		例子2中：start()方法是在构造函数中调用的。在构造函数中启动线程是很危险的。
 * 		因为一个任务可能会在构造器结束之前开始执行。这意味着该任务能够访问处于不稳定状态的对象。
 * 		这是为什么优选Executor创建线程的原因之一。
 * 
 * 3. 使用继承Thread类的内部类隐藏线程代码。
 * 
 * 4. 使用继承Thread类的匿名内部类隐藏线程代码。
 * 
 * 5. 使用实现Runnable接口的内部类隐藏线程代码。
 * 
 * 6. 使用实现Runnable接口的匿名内部类隐藏线程代码。
 * 
 * 7. 一个隔离的方作为一个任务。
 * 
 */

/* 1. 直接继承Thread 重写run()方法。

public class Demo11CodingVariations extends Thread {
	private int countDown = 5;
	private static int threadCount = 0;
	public Demo11CodingVariations() {
		super(Integer.toString(++threadCount));
		//当new一个对象时。线程自动启动。因为Demo11CodingVariations继承Thread类。
		start();
	}
	
	public String toString() {
		return "#" + getName() + "(" + countDown +")";
	}
	
	public void run() {
		while(true) {
			//打印当前对象时，会调用toString().
			System.out.println(this);
			if (--countDown == 0) {
				return;
			}
		}
	}
	public static void main(String[] args) {
		for (int i = 0; i < 5; i++) {
			new Demo11CodingVariations();
		}
	}
}

*/

/* 2. 直接实现自管理的Runnable接口并实现run()方法。 

public class Demo11CodingVariations implements Runnable {
	private int countDown = 5;
	private Thread t = new Thread(this);
	
	public Demo11CodingVariations() {
		t.start();
	}
	
	public String toString() {
		return Thread.currentThread().getName() + "(" + countDown + ")";
	}
	
	public void run() {
		while(true) {
			//打印当前对象时，会调用toString().
			System.out.println(this);
			if (--countDown == 0) {
				return;
			}
		}
	}
	public static void main(String[] args) {
		for (int i = 0; i < 5; i++) {
			new Demo11CodingVariations();
		}
	}
}

*/

/* 3. 使用继承Thread类的内部类隐藏线程代码。 

public class Demo11CodingVariations{
	private int countDown = 5;
	private InnerClass innerClass = null;
	
	public Demo11CodingVariations(String name) {
		innerClass = new InnerClass(name);
	}
	
	class InnerClass extends Thread {
		public InnerClass(String name) {
			super(name);
			start();
		}
		
		public void run() {
			while(true) {
				//打印当前对象时，会调用toString().
				System.out.println(this);
				if (--countDown == 0) {
					return;
				}
				
				try {
					TimeUnit.SECONDS.sleep(1);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
		
		public String toString() {
			return getName() + "(" + countDown + ")";
		}	
	}

	public static void main(String[] args) {
		for (int i = 0; i < 5; i++) {
			new Demo11CodingVariations("CCTV");
		}
	}
}

*/

/* 4. 使用继承Thread类的匿名内部类隐藏线程代码。

public class Demo11CodingVariations{
	private int countDown = 5;
	private Thread t = null;
	
	public Demo11CodingVariations(String name) {
		t = new Thread() {
			
			public void run() {
				while(true) {
					//打印当前对象时，会调用toString().
					System.out.println(this);
					if (--countDown == 0) {
						return;
					}
					
					try {
						TimeUnit.SECONDS.sleep(1);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
			
			public String toString() {
				return getName() + "(" + countDown + ")";
			}	
		};
		t.start();
	}

	public static void main(String[] args) {
		for (int i = 0; i < 5; i++) {
			new Demo11CodingVariations("CCTV");
		}
	}
}

*/

/* 5. 使用实现Runnable接口的内部类隐藏线程代码。

public class Demo11CodingVariations{
	private int countDown = 5;
	private InnerClass innerClass = null;
	
	public Demo11CodingVariations(String name) {
		setInnerClass(new InnerClass(name));
	}

	public InnerClass getInnerClass() {
		return innerClass;
	}

	public void setInnerClass(InnerClass innerClass) {
		this.innerClass = innerClass;
	}

	private class InnerClass implements Runnable {
		Thread t = null;
		
		InnerClass(String name) {
			t = new Thread(this, name);
			t.start();
		}

		@Override
		public void run() {
			while(true) {
				//打印当前对象时，会调用toString().
				System.out.println(this);
				if (--countDown == 0) {
					return;
				}
				
				try {
					TimeUnit.SECONDS.sleep(1);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
		
		public String toString() {
			return t.getName() + "(" + countDown + ")";
		}
	}

	public static void main(String[] args) {
		for (int i = 0; i < 5; i++) {
			new Demo11CodingVariations("CCTV");
		}
	}
}

*/

/* 6. 使用实现Runnable接口的匿名内部类隐藏线程代码。

public class Demo11CodingVariations{
	private int countDown = 5;
	private Thread t = null;
	
	public Thread getT() {
		return t;
	}

	public void setT(Thread t) {
		this.t = t;
	}

	public Demo11CodingVariations(String name) {
		setT(new Thread(new Runnable() {
			@Override
			public void run() {
				while(true) {
					//打印当前对象时，会调用toString().
					System.out.println(this);
					if (--countDown == 0) {
						return;
					}
					
					try {
						TimeUnit.SECONDS.sleep(1);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
			
			public String toString() {
				return Thread.currentThread().getName() + "(" + countDown + ")";
			}
		}, name));
		
		getT().start();
	}

	public static void main(String[] args) {
		for (int i = 0; i < 5; i++) {
			new Demo11CodingVariations("CCTV" + i);
		}
	}
}

*/

/* 7. 一个隔离的方作为一个任务 */

public class Demo11CodingVariations{
	private int countDown = 5;
	private Thread t = null;
	private String name = null;
	
	public Demo11CodingVariations(String name) {
		this.setName(name);
	}
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void runTask() {
		if (t == null) {
			t = new Thread(name) {
				public void run() {
					while(true) {
						//打印当前对象时，会调用toString().
						System.out.println(this);
						if (--countDown == 0) {
							return;
						}
						
						try {
							TimeUnit.SECONDS.sleep(1);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				}
				
				public String toString() {
					return t.getName() + "(" + countDown + ")";
				}
			};
			t.start();
		}
	}

	public static void main(String[] args) {
		for (int i = 0; i < 5; i++) {
			new Demo11CodingVariations("CCTV" + i).runTask();
		}
	}
}



